
package com.xbongbong.sys.domain.dao;

import com.xbongbong.sys.domain.entity.UserEntity;
import com.xbongbong.sys.domain.entity.ext.UserEntityExt;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * @author kaka
 * @since oldVersion
 */
@Repository
@Mapper
public interface UserDao {

    Integer insert(UserEntity user);

    Integer update(UserEntity user);

    Integer deleteByKey(@Param("key") String key, @Param("corpid") String corpid);

    /**
     * 根据公司id, userId获取员工.
     * 有效客户为del = 0, 若要求无视del,可将del置为null
     *
     * @param key 对应userId
     * @param corpid 公司corpid
     * @param del del标示
     * @return 符合条件的员工
     * @author kaka
     */
    UserEntity getByKey(@Param("key") String key, @Param("corpid") String corpid, @Param("del") Integer del);


    List<UserEntity> findEntitys(@Param("param") Map<String, Object> param);
    
    Integer getEntitysCount(@Param("param") Map<String, Object> param);

    List<UserEntity> findEntitysJoin(@Param("param") Map<String, Object> param);

    List<String> getUserIdsJoin(@Param("param") Map<String, Object> param);

    List<Map<String, Object>> getUserIdsJoinDeptGroup(@Param("param") Map<String, Object> param);

    /**
     * 根据筛选条件获取userId列表
     * @param param 筛选条件
     * @return 符合条件的userId列表
     */
    List<String> getUserIds(@Param("param") Map<String, Object> param);

    /**
     * 删除某公司的用户
     *
     * @param corpid 公司corpid
     */
    Integer deleteByCorpId(@Param("corpid") String corpid);

    /**
     * 更新微应用可见状态,单个公司所有用户
     *
     * @param corpid    公司ID
     * @param isVisible 1可见[授权]，0不可见[不授权]
     * @param del       0可见[授权]，2不可见[不授权]
     * @return
     * @author kaka
     * @time 2016年7月18日 下午3:52:16
     */
    Integer updateAllVisibleByCorpId(@Param("corpid") String corpid, @Param("isVisible") Integer isVisible, @Param("del") Integer del);

    /**
     * 更新微应用可见状态 ,单个公司单个或多个用户,暂时没在使用，若要使用请补上del设置
     *
     * @param corpid    公司ID
     * @param isVisible 1可见[授权]，0不可见[不授权]
     * @param userIdIn  需要修改的用户列表
     * @return
     * @author kaka
     * @time 2016年7月18日 下午3:55:23
     */
    Integer updateVisibleByCorpIdAndUserIdIn(@Param("corpid") String corpid, @Param("isVisible") Integer isVisible, @Param("userIdIn") List<String> userIdIn);

    /**
     * 更新微应用不可见状态 ,单个公司单个或多个用户
     *
     * @param corpid      公司ID
     * @param isVisible   1可见[授权]，0不可见[不授权]
     * @param userIdNotIn 不可见的用户列表
     * @param del         0可见[授权]，2不可见[不授权]
     * @return
     * @author kaka
     * @time 2016年7月18日 下午3:55:23
     */
    Integer updateVisibleByCorpIdAndUserIdNotIn(@Param("corpid") String corpid, @Param("isVisible") Integer isVisible, @Param("userIdNotIn") List<String> userIdNotIn, @Param("del") Integer del);

    /**
     * 获取企业当前有效的套餐数，如果没有套餐说明在免费套餐时期
     *
     * @param corpid 公司corpid
     * @return
     * @author kaka
     * @time 2016年8月22日 上午10:16:52
     */
    Integer getValidVipCount(@Param("corpid") String corpid);

    /**
     * 删除指定公司更新时间小于某个时间点的员工数据，
     * 主要用途是在组织架构同步完成后将未更新到的员工表信息置为删除状态，
     * 代替原来的提前删除逻辑
     * @param corpid 公司ID
     * @param updateTime 更新时间
     * @return 数据库操作返回，1表示成功，0表示失败
     * @author kaka
     * @date 2018年1月9日
     */
    Integer clearUnauthUserByUpdateTime(@Param("corpid") String corpid, @Param("updateTime") Integer updateTime);

    /**
     * 将userIds对应用户的roleId角色，批量去除
     * 1.员工角色只有1个不删除
     * 2.员工删除角色在原角色中没有不删除
     * 3.超级管理员角色不能删除，本条件在上层逻辑判断掉
     * @param corpid 公司id
     * @param userIds 需要删除角色的用户id列表
     * @param roleId 需要被去除的角色
     * @return 返回1表示成功，0表示失败
     */
    Integer roleBatchDel(@Param("corpid") String corpid, @Param("userIds") List<String> userIds, @Param("roleId")Integer roleId);

    /**
     * 为userIds对应用户增加roleId角色，批量增加
     * 1.员工角色大于5个不添加
     * 2.员工添加角色与原角色相同不添加
     * @param corpid 公司id
     * @param userIds 需要增加角色的用户id列表
     * @param roleId 需要被增加的角色
     * @return 返回1表示成功，0表示失败
     */
    Integer roleBatchAdd(@Param("corpid") String corpid, @Param("userIds") List<String> userIds, @Param("roleId")Integer roleId);

    /**
     * 根据用户id列表查询数据
     * @param userIdsList
     * @param corpid
     * @return
     */
    List<UserEntity> findEntitysByUserIds(@Param("list") List<String> userIdsList, @Param("corpid") String corpid);

    /**
     * 查包含具有某个角色的员工记录，拿一条即可，只用于判断有无
     * @param corpid 公司id
     * @param roleId 角色id
     * @return 被赋予该角色的员工记录
     */
    List<UserEntity> getUserWithRole(@Param("corpid") String corpid, @Param("roleId")Integer roleId);

    /**
     * 根据拼音排序 返回拼音首字母
     * @param param
     * @return
     */
    List<UserEntityExt> findEntitysOrderByPinyin(@Param("param") Map<String, Object> param);

    Integer updateBatch(@Param("list") List<UserEntity> userEntityList, @Param("corpid") String corpid);
}